﻿# _*_coding=utf-8 _*_
"""
作业要求：
背景：在使用 Python 进行《我是动物饲养员》这个游戏的开发过程中，有一个代码片段要求定义动物园、动物、猫、狗四个类。
这个类可以使用如下形式为动物园增加一只猫：

if __name__ == '__main__':
    # 实例化动物园
    z = Zoo('时间动物园')
    # 实例化一只猫，属性包括名字、类型、体型、性格
    cat1 = Cat('大花猫 1', '食肉', '小', '温顺')
    # 增加一只猫到动物园
    z.add_animal(cat1)
    # 动物园是否有猫这种动物
    have_cat = hasattr(z, 'Cat')

具体要求：
1.定义“动物”、“猫”、“狗”、“动物园”四个类，动物类不允许被实例化。
2.动物类要求定义“类型”、“体型”、“性格”、“是否属于凶猛动物”四个属性，是否属于凶猛动物的判断标准是：“体型 >= 中等”并且是“食肉类型”同时“性格凶猛”。
3.猫类要求有“叫声”、“是否适合作为宠物”以及“名字”三个属性，其中“叫声”作为类属性，除凶猛动物外都适合作为宠物，猫类继承自动物类。狗类属性与猫类相同，继承自动物类。
4.动物园类要求有“名字”属性和“添加动物”的方法，“添加动物”方法要实现同一只动物（同一个动物实例）不能被重复添加的功能。

时间：2021年1月5日
作者：长毛怪
"""


class Zoo:
    def __init__(self, name):
        self.name = name
        self.animal_list = []

    def add_animal(self, animal_instance):
        #  加动物类型。
        item = type(animal_instance).__name__
        if item not in self.__dict__:
            self.__dict__[item] = item

        #  加动物实例，按具体要求的第4条理解，应该是同一个动物实例不能被重复添加。
        if animal_instance not in self.animal_list:
            self.animal_list.append(animal_instance)
            print(f'这个名叫  {animal_instance.name}  的动物实例还没有，  {self.name}  收了……')
        else:
            print(f'这个名叫  {animal_instance.name}  动物实例  {self.name}  已经有了……')


class Animal:
   
    def __init__(*self):
        def err():
            raise Exception
        try:
            err()
        except Exception:
            print('异常：骚年，这个类不能被实例化♪^∇^*！！')
    
    def attr(self, name, animal_type, somatotype, nature):
        self.name = name
        self.animal_type = animal_type
        self.somatotype = somatotype
        self.nature = nature

        somatotype_list = ['小', '中等', '大']
        if somatotype_list.index(somatotype) >= 1 and animal_type == '食肉' and nature == '凶猛':
            self.terrible = '属于凶猛动物'
            print(f'重要提示：{ self.sounds}  {self.name}  是只凶猛动物，不适合作为宠物！！！')
        else:
            self.terrible = '不属于凶猛动物'


class Cat(Animal):
    sounds = '喵^^……biubiubiu(づ￣3￣)づ╭❤～'

    def __init__(self, name, animal_type, somatotype, nature):
        super().attr(name, animal_type, somatotype, nature)
        if self.terrible != '属于凶猛动物':
            self.pet = '适合做宠物'
        else:
            self.pet = '不适合做宠物'


class Dog(Animal):
    sounds = '汪汪汪^^……biubiubiu(づ￣3￣)づ╭❤～'

    def __init__(self, name, animal_type, somatotype, nature):
        super().__init__(name, animal_type, somatotype, nature)
        if self.terrible != '属于凶猛动物':
            self.pet = '适合做宠物'
        else:
            self.pet = '不适合做宠物'


if __name__ == '__main__':
    # 实例化动物类，报异常，不能被实例化。
    p = Animal()
    # 实例化动物园
    z = Zoo('时间动物园')
    # 实例化一只猫，属性包括名字、类型、体型、性格
    cat1 = Cat('大花猫 1', '食肉', '大', '凶猛')
    # 再实例化另一只猫，属性包括名字、类型、体型、性格，做测试
    cat2 = Cat('大花猫 2', '食肉', '小', '温顺')
    # 增加一只猫到动物园
    z.add_animal(cat1)
    # 再增加一只猫到动物园
    z.add_animal(cat2)
    # 重复增加第一只猫到动物园
    z.add_animal(cat1)
    # 动物园是否有猫这种动物
    have_cat = hasattr(z, 'Cat')
    have_dog = hasattr(z, 'Dog')
    print(have_cat)
    print(have_dog)
    
